From 8fd94b35bf87f80ff615f62d3b2f4140162eba93 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Thu, 27 Jul 2006 13:34:09 +0100 Subject: [PATCH] [NET] back: Make use of the simplicity of tasklets in net_rx_action Tasklets have the property that each one is running on only one CPU at any time. This means that you don't have to worry about the tasklet racing against itself. Therefore any resources used by just a single tasklet does not need to be guarded by locks. Since net_rx_action is the only user of alloc_mfn, we can remove the mfn_lock that guard it. The notify_list array is huge by Linux standards so placing it on the stack is unsafe. Since net_rx_action is not re-entrant, we can simply make it static. Signed-off-by: Herbert Xu --- linux-2.6-xen-sparse/drivers/xen/netback/netback.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/linux-2.6-xen-sparse/drivers/xen/netback/netback.c b/linux-2.6-xen-sparse/drivers/xen/netback/netback.c index 52cb7e7382..6795bcd3af 100644 --- a/linux-2.6-xen-sparse/drivers/xen/netback/netback.c +++ b/linux-2.6-xen-sparse/drivers/xen/netback/netback.c @@ -99,24 +99,21 @@ static spinlock_t net_schedule_list_lock; #define MAX_MFN_ALLOC 64 static unsigned long mfn_list[MAX_MFN_ALLOC]; static unsigned int alloc_index = 0; -static DEFINE_SPINLOCK(mfn_lock); static unsigned long alloc_mfn(void) { - unsigned long mfn = 0, flags; + unsigned long mfn = 0; struct xen_memory_reservation reservation = { .nr_extents = MAX_MFN_ALLOC, .extent_order = 0, .domid = DOMID_SELF }; set_xen_guest_handle(reservation.extent_start, mfn_list); - spin_lock_irqsave(&mfn_lock, flags); if ( unlikely(alloc_index == 0) ) alloc_index = HYPERVISOR_memory_op( XENMEM_increase_reservation, &reservation); if ( alloc_index != 0 ) mfn = mfn_list[--alloc_index]; - spin_unlock_irqrestore(&mfn_lock, flags); return mfn; } @@ -222,9 +219,13 @@ static void net_rx_action(unsigned long unused) unsigned long vdata, old_mfn, new_mfn; struct sk_buff_head rxq; struct sk_buff *skb; - u16 notify_list[NET_RX_RING_SIZE]; int notify_nr = 0; int ret; + /* + * Putting hundreds of bytes on the stack is considered rude. + * Static works because a tasklet can only be on one CPU at any time. + */ + static u16 notify_list[NET_RX_RING_SIZE]; skb_queue_head_init(&rxq); -- 2.30.2